package partThree;

import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
import org.junit.Test;

public class TestFileList2 {
    /*
     *一、采用实现接口的方式
     *  1.
     *  2.使用Pattern.compile方法对正则表达式regax进行编译
     *  3.重写FilenameFilter类中未实现的accept方法
     *    在重写的方法中使用Pattern.matcher方法匹配字符串，并返回其实例进行matches()的全局匹配
     */
    class FileNameFilterImplement implements FilenameFilter {
        private Pattern pattern;

        public FileNameFilterImplement(String regex) {
            pattern = Pattern.compile(regex);
        }

        @Override
        public boolean accept(File dir, String name) {
            //boolean result = pattern.matcher(name).matches();
            boolean result = pattern.matcher(name).matches();
            return result;
        }
    }
    /*
     * 二、采用匿名内部类的方式。
     * 不用implements的方式来实现接口，但是定义一个静态方法，此静态方法返回一个FilenameFilter对象，
     * 本来正常的语句是return new FilenameFilter();但是在语句结束之前,我们使用匿名内部类的方式进行方法的调用
     * 在内部类中，使用Pattern.compile方法对正则表达式regax进行编译
     * 并且重写FilenameFilter类中未实现的accept方法
     */
    static class FileNameFilterInner{
        public static FilenameFilter filenameFilter(final String regex){
            return new FilenameFilter(){
                private Pattern pattern = Pattern.compile(regex);

                @Override
                public boolean accept(File dir, String name) {
                    return pattern.matcher(name).matches();
                }
            };
        }
    }


        @Test
        public void test2(){
        System.out.println("------使用用接口实现方式，挑选当前目录下以.开头的文件或文件夹-------");
        //1、使用用接口实现方式，挑选当前目录下以.开头的文件或文件夹，并且打印出来(创建一个类来实现FilenameFilter接口)
        File path = new File(".");
        String[] nameList = path.list(new FileNameFilterImplement("\\..*"));
        for(String itemName : nameList){
            System.out.println(itemName);
        }

        System.out.println("------使用内部类实现方式，挑选当前目录下以o开头的文件或文件夹-------");
        //2、挑选当前目录下以o开头的文件或文件夹，并且打印出来(使用匿名内部类的方式来实现)
        File path2 = new File(".");
        String[] nameList2 = path2.list(FileNameFilterInner.filenameFilter("o.*"));
        for(String itemName : nameList2){
            System.out.println(itemName);
        }

        System.out.println("------使用匿名内部类实现方式，挑选当前目录下以s开头的文件或文件夹-------");
        //3、将匿名内部类利用到极致
        File path3 = new File(".");
        String[] nameList3 = path3.list(new FilenameFilter(){//其实是在第二种方式的基础上精简过来的。
            private Pattern pattern = Pattern.compile("s.*");
            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        });
        for(String itemName : nameList3){
            System.out.println(itemName);
        }
    }
}